<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="chrome://global/skin"?>
<?xml-stylesheet type="text/css" href="chrome://mochikit/content/tests/SimpleTest/test.css"?>
<!--
https://bugzilla.mozilla.org/show_bug.cgi?id=874090
-->
<window title="Mozilla Bug 874090" onload="runTests()"
        xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"/>
  <script type="application/javascript" src="chrome://mochikit/content/tests/SimpleTest/EventUtils.js"/>

  <!-- test results are displayed in the html:body -->
  <body xmlns="http://www.w3.org/1999/xhtml">
  <a href="https://bugzilla.mozilla.org/show_bug.cgi?id=874090"
     target="_blank">Mozilla Bug 874090</a>
  </body>

  <!-- test code goes here -->
  <script type="application/javascript">
  <![CDATA[
  /** Test for Bug 874090 **/
  const MOCK_CID = Components.ID("{2a0f83c4-8818-4914-a184-f1172b4eaaa7}");
  const ALERTS_SERVICE_CONTRACT_ID = "@mozilla.org/alerts-service;1";

  var mockAlertsService = {
    showAlert: function(alert, alertListener) {
      ok(true, "System principal was granted permission and is able to call showAlert.");
      unregisterMock();
      SimpleTest.finish();
    },

    showAlertNotification: function(imageUrl, title, text, textClickable,
                                    cookie, alertListener, name, dir, lang, data) {
      this.showAlert();
    },

    QueryInterface: function(aIID) {
      if (aIID.equals(Components.interfaces.nsISupports) ||
          aIID.equals(Components.interfaces.nsIAlertsService)) {
        return this;
      }
      throw Components.results.NS_ERROR_NO_INTERFACE;
    },

    createInstance: function(aOuter, aIID) {
      if (aOuter != null) {
        throw Components.results.NS_ERROR_NO_AGGREGATION;
      }
      return this.QueryInterface(aIID);
    }
  };

  function registerMock() {
    Components.manager.QueryInterface(Components.interfaces.nsIComponentRegistrar).
      registerFactory(MOCK_CID, "alerts service", ALERTS_SERVICE_CONTRACT_ID, mockAlertsService);
  }

  function unregisterMock() {
    Components.manager.QueryInterface(Components.interfaces.nsIComponentRegistrar).
      unregisterFactory(MOCK_CID, mockAlertsService);
  }

  function runTests() {
    registerMock();

    is(Notification.permission, "granted", "System principal should be automatically granted permission.");

    Notification.requestPermission(function(permission) {
      is(permission, "granted", "System principal should be granted permission when calling requestPermission.");

      if (permission == "granted") {
        // Create a notification and make sure that it is able to call into
        // the mock alert service to show the notification.
        new Notification("Hello");
      } else {
        unregisterMock();
        SimpleTest.finish();
      }
    });
  }

  SimpleTest.waitForExplicitFinish();
  ]]>
  </script>
</window>
